Spring Boot:将JPA批量插入性能提高100倍

您所在的位置:网站首页 提高insert 速度 Spring Boot:将JPA批量插入性能提高100倍

Spring Boot:将JPA批量插入性能提高100倍

2023-03-23 18:06| 来源: 网络整理| 查看: 265

是否想改善您的插入记录?在本文中,您可以学习如何使用Spring Data JPA将批量插入性能提高100倍。

我遇到了一个问题,我想将数百万条记录插入数据库,而这需要从文件中导入。

因此,我对此进行了一些研究,并希望与您分享我发现的发现,这些发现帮助我将插入记录的吞吐量提高了近100倍。

最初,当我只是尝试使用spring JPA的saveAll方法进行批量插入时,每10,000条记录获得约185秒的性能。在执行以下更改之后,插入10,000条记录的性能仅需4.3秒。

是的,每10k记录4.3秒。

因此,要实现这一点,我必须更改插入数据的方式。

1.插入时更改记录数

最初插入时,我是通过调用saveAll方法直接推送列表中的所有10k记录。我将其更改为30的批处理大小。您也可以将批处理大小增加到甚至60,但是这并不是插入记录所花费的时间的一半。请参阅下表。

为此,您需要设置hibernate属性batch_size=30。

spring.jpa.properties.hibernate.jdbc.batch_size=30 cachePrepStmts=true useServerPrepStmts=true rewriteBatchedStatements=true e.g jdbc:mysql://localhost:3306/BOOKS_DB?serverTimezone=UTC&cachePrepStmts=true&useServerPrepStmts=true&rewriteBatchedStatements=true2.发送批处理记录

接下来,我更改了插入代码,以便saveAll按照我们也在属性文件中设置的方法,使方法的批处理大小为30。像这样的非常粗略的实现:

for (int i = 0; i < totalObjects; i = i + batchSize) { if( i+ batchSize > totalObjects){ List books1 = books.subList(i, totalObjects - 1); repository.saveAll(books1); break; } List books1 = books.subList(i, i + batchSize); repository.saveAll(books1); }

这减少了一点时间。它从185秒降低到153秒。大约提高了18%。

3.更改ID生成策略

这产生了重大影响。

最初,我在@GeneratedValue策略GenerationType.IDENTITY上使用注释,即在我的实体类上。

Hibernate使用此策略禁用了批量更新,因为它必须进行选择调用才能从数据库中获取ID以插入每一行。您可以在此处了解更多信息。

我将策略更改为SEQUENCE并提供了序列生成器。

public class Book { 2 @Id 3 @GeneratedValue(strategy = SEQUENCE, generator = "seqGen") 4 @SequenceGenerator(name = "seqGen", sequenceName = "seq", initialValue = 1) 5 private Long id;

由于Hibernate能够利用批量插入,这极大地改变了插入性能。

从以前的153秒的性能改进开始,插入10k记录的时间减少到只有9秒。性能提高了近95%。

注意:MySQL不支持创建序列。

为了解决这个问题,我创建了一个表,该表的序列名称只有一个名为的字段next_val。然后,我添加了具有初始值的单行。

对于上述序列,我创建了以下内容:

CREATE TABLE `seq` ( `next_val` bigint(20) DEFAULT NULL ); INSERT INTO `seq` (`next_val`) VALUES(1);

然后,Hibernate将下表用作序列生成器。

接下来,我进一步推动它以使用更大的批处理大小,并且我注意到将批处理大小加倍不会使时间按时增加一倍。插入时间仅逐渐减少。您可以在下面看到此内容:

对于我的情况,最佳的批处理大小为1,000,记录10K 大约需要4.39秒。在那之后,我看到了性能下降,如下图所示。

这是我得到的统计信息:

与往常一样,您可以在我的GitHub存储库中找到代码。

原文作者:didiao java原文链接:https://blog.csdn.net/weixin_46699878/article/details/113513823文章来源:CSDN侵删


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3